package football.stateless;

import java.sql.Date;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import football.modele.Administrateur;
import football.modele.Arbitre;
import football.modele.But;
import football.modele.Equipe;
import football.modele.Joueur;
import football.modele.Match;
import football.modele.Phase;
import football.modele.Tournoi;

/**
 * Session Bean implementation class GestionTounoiBean
 */
@Stateless(name = "gestionEJB", mappedName = "gestionEJB")
public class GestionTounoiBean implements GestionTounoiRemote,
		GestionTounoiLocal, GestionTournoi {

	@PersistenceContext
	EntityManager em;

	@Override
	public Collection<Tournoi> getAllTournois() {
		Query q = em.createQuery("From Tournoi");
		return q.getResultList();
	}

	@Override
	public Collection<Arbitre> getAllArbitres() {
		Query q = em.createQuery("From Arbitre");
		return q.getResultList();
	}

	private void peupler() {
		Administrateur a = new Administrateur();
		a.setLogin("sa");
		a.setPassword("sa");
		em.persist(a);

		Tournoi t = new Tournoi("Champion's League", "Paris",
				Date.valueOf("2012-09-09"), 16);

		Set<Equipe> listeEquipes = new HashSet<Equipe>();

		// ***************************************
		// ************* Equipe n�1 **************
		// ***************************************

		Set<Joueur> tmp1 = new HashSet<Joueur>();

		Equipe e1 = new Equipe();
		e1.setNomEquipe("Paris-St-Germain");
		e1.setTournoi(t);
		e1.setNumeroEquipe(1);

		Joueur j1 = new Joueur();
		j1.setNomJoueur("Ibrahimovic");
		j1.setPrenomJoueur("Zlatan");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		Joueur j2 = new Joueur();
		j2.setNomJoueur("Cavani");
		j2.setPrenomJoueur("Edinson");
		j2.setPoste("Attaquant");
		j2.setEquipeJ(e1);
		tmp1.add(j2);
		em.persist(j2);

		Joueur j10 = new Joueur();
		j10.setNomJoueur("Lavezzi");
		j10.setPrenomJoueur("Ezequiel");
		j10.setPoste("Attaquant");
		j10.setEquipeJ(e1);
		tmp1.add(j10);
		em.persist(j10);

		Joueur j3 = new Joueur();
		j3.setNomJoueur("Matuidi");
		j3.setPrenomJoueur("Blaise");
		j3.setPoste("Milieu");
		j3.setEquipeJ(e1);
		tmp1.add(j3);
		em.persist(j3);

		Joueur j4 = new Joueur();
		j4.setNomJoueur("Motta");
		j4.setPrenomJoueur("Thiago");
		j4.setPoste("Milieu");
		j4.setEquipeJ(e1);
		tmp1.add(j4);
		em.persist(j4);

		Joueur j6 = new Joueur();
		j6.setNomJoueur("Verratti");
		j6.setPrenomJoueur("Marco");
		j6.setPoste("Milieu");
		j6.setEquipeJ(e1);
		tmp1.add(j6);
		em.persist(j6);

		Joueur j7 = new Joueur();
		j7.setNomJoueur("Pastore");
		j7.setPrenomJoueur("Javier");
		j7.setPoste("Milieu");
		j7.setEquipeJ(e1);
		tmp1.add(j7);
		em.persist(j7);

		Joueur j8 = new Joueur();
		j8.setNomJoueur("Silva");
		j8.setPrenomJoueur("Thiago");
		j8.setPoste("Milieu");
		j8.setEquipeJ(e1);
		tmp1.add(j8);
		em.persist(j8);

		Joueur j9 = new Joueur();
		j9.setNomJoueur("Moura");
		j9.setPrenomJoueur("Lucas");
		j9.setPoste("Milieu");
		j9.setEquipeJ(e1);
		tmp1.add(j9);
		em.persist(j9);

		Joueur j11 = new Joueur();
		j11.setNomJoueur("Jallet");
		j11.setPrenomJoueur("Christophe");
		j11.setPoste("D�fenseur");
		j11.setEquipeJ(e1);
		tmp1.add(j11);
		em.persist(j11);

		Joueur j12 = new Joueur();
		j12.setNomJoueur("Costa");
		j12.setPrenomJoueur("Alex");
		j12.setPoste("D�fenseur");
		j12.setEquipeJ(e1);
		tmp1.add(j12);
		em.persist(j12);

		Joueur j13 = new Joueur();
		j13.setNomJoueur("Maxwell");
		;
		j13.setPoste("D�fenseur");
		j13.setEquipeJ(e1);
		tmp1.add(j13);
		em.persist(j13);

		Joueur j14 = new Joueur();
		j14.setNomJoueur("Douchez");
		j14.setPrenomJoueur("Nicolas");
		j14.setPoste("Gardien");
		j14.setEquipeJ(e1);
		tmp1.add(j14);
		em.persist(j14);

		Joueur j5 = new Joueur();
		j5.setNomJoueur("Sirigu");
		j5.setPrenomJoueur("Salvatore");
		j5.setPoste("Gardien");
		j5.setEquipeJ(e1);
		tmp1.add(j5);
		em.persist(j5);

		e1.setListeJoueurs(tmp1);
		listeEquipes.add(e1);
		em.persist(e1);

		// ***************************************
		// ************* Equipe n�2 **************
		// ***************************************

		Set<Joueur> tmp2 = new HashSet<Joueur>();

		Equipe e2 = new Equipe();
		e2.setNomEquipe("Arsenal FC");
		e2.setTournoi(t);
		e2.setNumeroEquipe(2);

		Joueur j15 = new Joueur();
		j15.setNomJoueur("Giroud");
		j15.setPrenomJoueur("Olivier");
		j15.setPoste("Attaquant");
		j15.setEquipeJ(e2);
		tmp2.add(j15);
		em.persist(j15);

		Joueur j16 = new Joueur();
		j16.setNomJoueur("Podolski");
		j16.setPrenomJoueur("Lukas");
		j16.setPoste("Attaquant");
		j16.setEquipeJ(e2);
		tmp2.add(j16);
		em.persist(j16);

		Joueur j17 = new Joueur();
		j17.setNomJoueur("Wilshere");
		j17.setPrenomJoueur("Jack");
		j17.setPoste("Milieu");
		j17.setEquipeJ(e2);
		tmp2.add(j17);
		em.persist(j17);

		Joueur j18 = new Joueur();
		j18.setNomJoueur("Ramsey");
		j18.setPrenomJoueur("Aaron");
		j18.setPoste("Milieu");
		j18.setEquipeJ(e2);
		tmp2.add(j18);
		em.persist(j18);

		Joueur j19 = new Joueur();
		j19.setNomJoueur("Szczesny");
		j19.setPrenomJoueur("Wojciech");
		j19.setPoste("Gardien");
		j19.setEquipeJ(e2);
		tmp2.add(j19);
		em.persist(j19);

		Joueur j20 = new Joueur();
		j20.setNomJoueur("Arteta");
		j20.setPrenomJoueur("Mikel");
		j20.setPoste("Milieu");
		j20.setEquipeJ(e2);
		tmp2.add(j20);
		em.persist(j20);

		Joueur j21 = new Joueur();
		j21.setNomJoueur("Flamini");
		j21.setPrenomJoueur("Mathieu");
		j21.setPoste("Milieu");
		j21.setEquipeJ(e2);
		tmp2.add(j21);
		em.persist(j21);

		Joueur j22 = new Joueur();
		j22.setNomJoueur("Cazorla");
		j22.setPrenomJoueur("Santiago");
		j22.setPoste("Milieu");
		j22.setEquipeJ(e2);
		tmp2.add(j22);
		em.persist(j22);

		Joueur j23 = new Joueur();
		j23.setNomJoueur("Ozil");
		j23.setPrenomJoueur("Mesut");
		j23.setPoste("Milieu");
		j23.setEquipeJ(e2);
		tmp2.add(j23);
		em.persist(j23);

		Joueur j24 = new Joueur();
		j24.setNomJoueur("Walcott");
		j24.setPrenomJoueur("Theo");
		j24.setPoste("Attaquant");
		j24.setEquipeJ(e2);
		tmp2.add(j24);
		em.persist(j24);

		Joueur j25 = new Joueur();
		j25.setNomJoueur("Koscielny");
		j25.setPrenomJoueur("Laurent");
		j25.setPoste("D�fenseur");
		j25.setEquipeJ(e2);
		tmp2.add(j25);
		em.persist(j25);

		Joueur j26 = new Joueur();
		j26.setNomJoueur("Sagna");
		j26.setPrenomJoueur("Bacary");
		j26.setPoste("D�fenseur");
		j26.setEquipeJ(e2);
		tmp2.add(j26);
		em.persist(j26);

		Joueur j27 = new Joueur();
		j27.setNomJoueur("Boateng");
		j27.setPrenomJoueur("Daniel");
		j27.setPoste("D�fenseur");
		j27.setEquipeJ(e2);
		tmp2.add(j27);
		em.persist(j27);

		Joueur j28 = new Joueur();
		j28.setNomJoueur("Viviano");
		j28.setPrenomJoueur("Emiliano");
		j28.setPoste("Gardien");
		j28.setEquipeJ(e2);
		tmp2.add(j28);
		em.persist(j28);

		e2.setListeJoueurs(tmp2);
		listeEquipes.add(e2);
		em.persist(e2);

		tmp1.clear();

		// ***************************************
		// ************* Equipe n�3 **************
		// ***************************************

		e1 = new Equipe();
		e1.setNomEquipe("Manchester United");
		e1.setTournoi(t);
		e1.setNumeroEquipe(3);

		j1 = new Joueur();
		j1.setNomJoueur("Van Persie");
		j1.setPrenomJoueur("Robin");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Rooney");
		j1.setPrenomJoueur("Wayne");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Hernandez");
		j1.setPrenomJoueur("Javier");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Welbeck");
		j1.setPrenomJoueur("Danny");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Kagawa");
		j1.setPrenomJoueur("Shinji");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Giggs");
		j1.setPrenomJoueur("Ryan");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Carrick");
		j1.setPrenomJoueur("Michael");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Young");
		j1.setPrenomJoueur("Ashley");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Ferdinand");
		j1.setPrenomJoueur("Rio");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Evra");
		j1.setPrenomJoueur("Patrice");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Evans");
		j1.setPrenomJoueur("Jonathan");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Vidic");
		j1.setPrenomJoueur("Nemanja");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("De Gea");
		j1.setPrenomJoueur("David");
		j1.setPoste("Gardien");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Lindegaard");
		j1.setPrenomJoueur("Anders");
		j1.setPoste("Gardien");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		e1.setListeJoueurs(tmp1);
		listeEquipes.add(e1);
		em.persist(e1);

		tmp1.clear();

		// ***************************************
		// ************* Equipe n�4 **************
		// ***************************************

		e1 = new Equipe();
		e1.setNomEquipe("AC Milan");
		e1.setTournoi(t);
		e1.setNumeroEquipe(4);

		j1 = new Joueur();
		j1.setNomJoueur("Balotelli");
		j1.setPrenomJoueur("Mario");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("El Shaarawy");
		j1.setPrenomJoueur("Stephan");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Pazzini");
		j1.setPrenomJoueur("Giampaolo");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Robinho");
		j1.setPoste("Attaquant");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("De Jong");
		j1.setPrenomJoueur("Nigel");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Kaka");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Montolivo");
		j1.setPrenomJoueur("Riccardo");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Birsa");
		j1.setPrenomJoueur("Valter");
		j1.setPoste("Milieu");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Mexes");
		j1.setPrenomJoueur("Philippe");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Rami");
		j1.setPrenomJoueur("Adil");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Zaccardo");
		j1.setPrenomJoueur("Cristian");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Bonera");
		j1.setPrenomJoueur("Daniele");
		j1.setPoste("D�fenseur");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Abbiati");
		j1.setPrenomJoueur("Christian");
		j1.setPoste("Gardien");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		j1 = new Joueur();
		j1.setNomJoueur("Coppola");
		j1.setPrenomJoueur("Ferninando");
		j1.setPoste("Gardien");
		j1.setEquipeJ(e1);
		tmp1.add(j1);
		em.persist(j1);

		e1.setListeJoueurs(tmp1);
		listeEquipes.add(e1);
		em.persist(e1);

		t.setListeEquipes(listeEquipes);
		em.persist(t);

		// Arbitres
		Arbitre a1 = new Arbitre("Batta", "Marc");
		em.persist(a1);
		Arbitre a2 = new Arbitre("Quievreux", "Laurent");
		em.persist(a2);
		Arbitre a3 = new Arbitre("Jaffredo", "Lionel");
		em.persist(a3);
		Arbitre a4 = new Arbitre("Kalt", "Batta");
		em.persist(a4);
	}

	@Override
	public void addTounoi(Tournoi t) {
		this.em.persist(t);
	}

	@Override
	public void addEquipe(Equipe e) {
		this.em.persist(e);
	}

	@Override
	public Tournoi getTournoiParId(int parseInt) {
		Query q = em.createQuery("From Tournoi where idTournoi=?1");
		q.setParameter(1, parseInt);
		return (Tournoi) q.getSingleResult();
	}

	@Override
	public void majEquipe(Equipe e) {
		this.em.merge(e);
	}

	@Override
	public void addJoueur(Joueur jou) {
		this.em.persist(jou);
	}

	@Override
	public boolean authentifier(String id, String passwd) {
		Collection<Administrateur> collec = em.createQuery(
				"From Administrateur").getResultList();
		if (collec.isEmpty()) {
			peupler();
		}
		Query q = em
				.createQuery("From Administrateur a where a.login=?1 and a.password=?2");
		q.setParameter(1, id);
		q.setParameter(2, passwd);
		try {
			q.getSingleResult();
		} catch (NoResultException e) {
			return false;
		}
		return true;
	}

	@Override
	public void majTournoi(Tournoi temp) {
		this.em.merge(temp);
	}

	@Override
	public Collection<Match> getMatchFromPhase(int idPhase) {
		Query q = em
				.createQuery("From Match where idPhase=?1 order by idMatch");
		q.setParameter(1, idPhase);
		return (Collection<Match>) q.getSingleResult();
	}

	@Override
	public void addMatch(Match matchTemp) {
		this.em.persist(matchTemp);
	}

	@Override
	public void addPhase(Phase phaseTemp) {
		this.em.persist(phaseTemp);
	}

	@Override
	public void majPhase(Phase phaseTemp) {
		this.em.merge(phaseTemp);
	}

	@Override
	public Equipe getEquipeById(int parseInt) {
		Query q = em.createQuery("From Equipe where idEquipe=?1");
		q.setParameter(1, parseInt);
		return (Equipe) q.getSingleResult();
	}

	@Override
	public Match getMatchById(int parseInt) {
		Query q = em.createQuery("From Match where idMatch=?1");
		q.setParameter(1, parseInt);
		return (Match) q.getSingleResult();
	}

	@Override
	public Joueur getJoueurById(int parseInt) {
		Query q = em.createQuery("From Joueur where idJoueur=?1");
		q.setParameter(1, parseInt);
		return (Joueur) q.getSingleResult();
	}

	@Override
	public void addBut(But b) {
		this.em.persist(b);
	}

	@Override
	public void addArbitre(Arbitre arb) {
		this.em.persist(arb);
	}

	@Override
	public void majMatch(Match mFini) {
		this.em.merge(mFini);
	}

	@Override
	public void addAadmin(Administrateur a) {
		this.em.persist(a);
	}

	@Override
	public void removeBut(int idBut, Match m) {
		Match m2 = (Match) em.find(Match.class, m.getIdMatch());
		Iterator<But> it = m2.getListeButs().iterator();
		while (it.hasNext()) {
			But b = it.next();
			if (b.getIdBut() == idBut) {
				it.remove();
				em.remove(b);
				return;
			}
		}
	}

}
